#include "Mixte.h"

/**
* Constructeur
*/
Mixte::Mixte() : DTDElement( E_MIXTE )
{
	// TODO
}

Mixte::Mixte( std::list<SimpleName*>& list ) : DTDElement( E_MIXTE ), names( list )
{
}

/**
* Destructeur
*/
Mixte::~Mixte()
{
	/* Libération de la mémoire */
	std::list<SimpleName*>::iterator it;
	for( it = names.begin(); it != names.end(); it++ )
	{
		if( (*it) )
			delete (*it);
	}
}

void Mixte::addName( SimpleName* cp )
{
	names.push_back( cp );
}

void Mixte::printMe()
{
	std::list<SimpleName*>::iterator p = names.begin();
	std::cout<<"<!ELEMENT "<<name<<" (#PCDATA";
	while(p != names.end())
	{
		if(p != names.end())
			std::cout<<" | ";

		(*p)->printMe();
		p++;

	}
	std::cout<<")>"<<endl;
}

/**
* Retourne le mixte sous la forme d'une regexp
*/
pair<string, regex> Mixte::toRegExp()
{
	std::string regexp;

	/* On peut avoir un #PCDATA */
	regexp += "#PCDATA";

	/* Mais aussi tout ce qui est dans la liste names */
	std::list<SimpleName*>::iterator it = names.begin();
	while( it != names.end() )
	{
		regexp += "|";
		regexp += (*it)->getName();

		it++;
	}

	cout << "pair( " << this->name << ", " << regexp << " )" << endl;
	return pair<string, regex>( this->name, regex( regexp ) );
}

